import random
import re
from datetime import datetime

from flask import request, abort, current_app, make_response, Response, jsonify, session

from info import rs, db
from info.libs.captcha.pic_captcha import captcha
from info.libs.yuntongxun.sms import CCP
from info.modules.passport import passport_blu
from info.utils.constants import SMS_CODE_REDIS_EXPIRES
from info.utils.models import User
from info.utils.response_code import RET, error_map


@passport_blu.route("/get_img_code")
def get_img():
    # 1.获取前端传过来的图片key
    img_code_id = request.args.get('img_code_id')
    # 校验参数
    if not img_code_id:
        return abort(403)
    # 2.调用第三方的包生成图片和验证码
    img_name, img_text, img_batys = captcha.generate_captcha()
    # 3.将图片key和验证码文字保存到redis里
    try:
        rs.set("get_img_code:" + img_code_id, img_text, ex=SMS_CODE_REDIS_EXPIRES)
    except BaseException as e:
        current_app.logger.errer(e)
        return abort(500)
    # 4.返回图片  需要自定义响应对象，否则返回的html格式
    response = make_response(img_batys)  # type:Response
    # 设置响应头为content_tepy格式
    response.content_type = "image/jpeg"

    return response


# 短信校验
@passport_blu.route('/get_sms_code', methods=["post"])
def get_sms():
    # 获取参数
    img_code_id = request.json.get("img_code_id")
    mobile = request.json.get("mobile")
    img_code = request.json.get("img_code")
    # 校验参数
    if not all([img_code_id, mobile, img_code]):
        return jsonify(error=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])  # 返回自定义的错误码
    if not re.match(r"^1[23456789]\d{9}$", mobile):
        return jsonify(error=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    # 发短信之前校验手机号是否被注册
    try:
        real_mobile = User.query.filter_by(mobile=mobile).first()
    except BaseException as e:
        return jsonify(error=RET.DBERR, errmsg=error_map[RET.DBERR])
    if  real_mobile:
        return jsonify(error = RET.DATAERR,errmsg = error_map[RET.DATAERR])
    # 校验验证码
    try:
        rel_img_id = rs.get("get_img_code:" + img_code_id)
    except BaseException as e:
        current_app.logger.errer(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # 校验图片验证码是否正确
    if img_code.upper() != rel_img_id:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 生成随机数字
    ramdom_num = "%04d" % random.randint(0, 9999)
    print(ramdom_num)
    #  生成短信验证码
    # response_code = CCP().send_template_sms(mobile, [remdom_num, SMS_CODE_REDIS_EXPIRES / 60], 1)
    # if response_code != 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])
    # 保存短信验证码
    try:
        rs.set("sms_code_id:" + mobile, ramdom_num, ex=SMS_CODE_REDIS_EXPIRES)

    except BaseException as e:
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # 返回结果
    return jsonify(errno=RET.OK, ermsg=error_map[RET.OK])

#注册
@passport_blu.route('/register',methods = ['post'])
def register():
# 获取前端的参数
    sms_code = request.json.get('sms_code')
    mobile = request.json.get('mobile')
    password = request.json.get('password')
# 校验参数
    if not all([sms_code,mobile,password]):
        return jsonify(errno=RET.PARAMERR, ermsg=error_map[RET.PARAMERR])
    if not re.match(r"^1[23456789]\d{9}$", mobile):
        return jsonify(error=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
# 数据库操作：保存手机号和密码
    #查询出数据中保存的验证码
    try:
        rel_sms_code= rs.get("sms_code_id:" + mobile)
    except BaseException as e:
        return jsonify(errno=RET.DBERR, ermsg=error_map[RET.DBERR])

#判断短信验证码是否正确
    if sms_code!=rel_sms_code:
        return jsonify(errno=RET.PARAMERR, ermsg=error_map[RET.PARAMERR])
    #将手机号和密码存到数据库
    user = User()
    # 使用计算型属性封装加密过程 对密码进行加密
    user.password=password
    user.mobile = mobile
    user.nick_name = mobile
    db.session.add(user)

    try:
        db.session.commit()
    except BaseException as e:
        current_app.logger.error(e)
        db.session.rollback()
    #使用session记录用户登陆信息，根据客户的主键id查询客户其他信息
    session["user_id"] = user.id
# 响应json
    return jsonify(errno=RET.OK, ermsg=error_map[RET.OK])

#用户登陆
@passport_blu.route("/login",methods = ['POST'])
def login():
    #获取参数
    mobile=request.json.get('mobile')
    password=request.json.get('password')
    #校验参数
    if not all([mobile,password]):
        return  jsonify(errno=RET.PARAMERR, ermsg=error_map[RET.PARAMERR])
    #查询数据库：根据参数查找数据库里的信息
    #获取数据库信息
    try:
        user = User.query.filter_by(mobile=mobile).first()

    except BaseException as e:
        current_app.logger.errer(e)
        return jsonify(errno=RET.DBERR, ermsg=error_map[RET.DBERR])
    #校验手机号是否正确
    if not user:
        return jsonify(errno=RET.PARAMERR, ermsg=error_map[RET.PARAMERR])
    #校验密码是否正确
    if not user.check_passoword:
        return jsonify(errno=RET.PWDERR, ermsg=error_map[RET.PWDERR])
    # 使用session记录用户登陆信息，根据客户的主键id查询客户其他信息
    session["user_id"] = user.id
    #记录用户最后登陆的时间
    user.last_login = datetime.now()
    #返回
    return jsonify(errno=RET.OK, ermsg=error_map[RET.OK])


#退出登陆
@passport_blu.route('/logout')
def logout():
    #删除session里的user——id
    session.pop("user_id",None)

    return jsonify(errno = RET.OK,errmsg = error_map[RET.OK])







